package com.xzz.exception;

import com.xzz.enums.GlobalErrorCode;
import com.xzz.result.JSONResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //全局系统异常处理方法，系统的错误，修改了浏览器上的500的固定显示，捕获了系统异常
    @ExceptionHandler(value = Exception.class)
    public JSONResult exceptionHandler(Exception e){
        e.printStackTrace();
        // 1.打印日志
        log.info("发生系统异常，异常信息为：" + e.getMessage());
        // 2.返回异常信息
        return JSONResult.error(GlobalErrorCode.SERVICE_ERROR);
    }

    //全局业务异常，自己主动给用户看的异常，比如密码错误，捕获业务异常
    @ExceptionHandler(value = GlobalCustomException.class)
    public JSONResult GlobalCustomExceptionHandler(GlobalCustomException e){
        e.printStackTrace();
        // 1.打印日志
        log.info("发生业务异常，异常码：{}, 异常信息：{}", e.getErrorCode(), e.getErrorMessage());
        // 2.返回异常信息
        return JSONResult.error(e.getErrorMessage(), e.getErrorCode());
    }

    //捕获校验业务异常错误信息
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JSONResult methodArgumentNotValidException(MethodArgumentNotValidException e){
        e.printStackTrace();
        //得到所有的字段异常提示信息
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        StringBuilder stringBuilder = new StringBuilder();
        //遍历得到所有异常提示语
        for (ObjectError allError : allErrors) {
            stringBuilder.append(allError.getDefaultMessage()).append(",");
        }
        // 打印日志
        log.info(stringBuilder.toString());
        // 返回异常信息
        return JSONResult.error(stringBuilder.toString(),"10000");
    }

}